{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Record, Save and Play Moves on Poppy Humanoid"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook intends to show you how to:\n",
    "\n",
    "* **record** movements using physical demonstrations,\n",
    "* **replay** those movements and sequence them,\n",
    "* **save** them to the hard drive and reload them."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You will need a working and correctly setup Poppy Humanoid to follow this notebook. \n",
    "\n",
    "As we will use physical demonstration, **you can not use a simulated robot.** Yet the same methods could be used on simulation if you are using other kind of demonstration (e.g. programatically)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Import some matplolib shortcuts for Jupyter notebook\n",
    "%matplotlib inline\n",
    "from __future__ import print_function\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Connect to your Poppy Humanoid"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using the usual Python code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from pypot.creatures import PoppyHumanoid\n",
    "\n",
    "poppy = PoppyHumanoid()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We then put it in its init position. We will use it as our working base:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "poppy.init_position.start()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Record movements"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, we need to import the *MoveRecorder* object that can be used to record any movements on a Poppy robot. It works with all robots including the Poppy Humanoid."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from pypot.primitive.move import MoveRecorder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To create this recorder we need some extra information:\n",
    "* on which **robot** to record the movements\n",
    "* at which **frequency** the positions need to be retrieved (50Hz is a good default values)\n",
    "* which **motors** are we actually recording (you can record a movement on a subpart of your robot)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "recorder = MoveRecorder(poppy, 50, poppy.l_arm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see we used the motor group *poppy.l_arm* as the list of motors to be recorded. It is a shortcut to the list of all motors in the left arm. It is equivalent to use the list of motors *[poppy.l_shoulder_y, poppy.l_shoulder_x, poppy.l_arm_z, poppy.l_elbow_y]*.\n",
    "\n",
    "Note that you can get all existing motors groups (aliases) with thf following command:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "poppy.alias"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Before actually recording a movement, we need to set the used motors compliant so they can be freely moved:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for m in poppy.l_arm:\n",
    "    m.compliant = True"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now the tip of the Poppy Humanoid should be free while the base is still stiff."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Even if the motors are free, they can still be used as sensor**. This means that you can record their present position even if you make them move by hand."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The recorder can be start and stop when you want. In the interval the positions of every selected motors will be recorded at the predefined frequency."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, prepare yourself to record your cool move! To start the record:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "recorder.start()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now move the robot! When you are done, you can stop the record:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "recorder.stop()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The move you just recorded can be accessed via:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "recorder.move"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can get the number of key frames that have been recorded:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "print('{} key frames have been recorded.'.format(len(recorder.move.positions())))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's store this move in a variable (we copy it to not erase it when we will do another record):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from copy import deepcopy\n",
    "\n",
    "my_first_move = deepcopy(recorder.move)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can also plot a move to see what it looks like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "ax = axes()\n",
    "my_first_move.plot(ax)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, let's record another move. This time we will record for 10 seconds and on the whole robot. You can easily do that using the following code:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First we recreate a recorder object with all motors. We also turn all motors compliant:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "recorder = MoveRecorder(poppy, 50, poppy.motors)\n",
    "\n",
    "for m in poppy.motors:\n",
    "    m.compliant = True"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And then record for 10 seconds:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "recorder.start()\n",
    "time.sleep(10)\n",
    "recorder.stop()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that the record is done, we also store it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "my_second_move = deepcopy(recorder.move)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Play recorded moves"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, we put back the robot in its rest position to avoid sudden movement:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "poppy.init_position.start()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Replaying move is really similar. First you need to create the *MovePlayer* object:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from pypot.primitive.move import MovePlayer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It requires:\n",
    "* the **robot** which will play the move\n",
    "* the **move** to play"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For instance, if we want to replay the first move we recorded:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "player = MovePlayer(poppy, my_first_move)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And to play it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "player.start()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once it's done, you can use the same code for the other move:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "player = MovePlayer(poppy, my_second_move)\n",
    "player.start()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can sequence moves by using the *wait_to_stop* method that will wait for the end of a move: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for move in [my_first_move, my_second_move]:\n",
    "    player = MovePlayer(poppy, move)\n",
    "    \n",
    "    player.start()\n",
    "    player.wait_to_stop()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Those movements can also be played in parallel. You will have to make sure that the movements can be combined otherwise pypot will simply add the different motor positions, possibly resulting in some unexpected moves. To avoid this problem make sure the moves you record are working on different sub sets of motors."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Save/Load moves"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To keep the moves you have recorded from one session to the other, the best solution is to store them on the hard drive of your robot. This can be done using the *save* method of a move:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with open('my-first-demo.move', 'w') as f:\n",
    "    my_first_move.save(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you look at the file, you will see a list (possibly quite long) of \"positions\". These positions are basically:\n",
    "* a **timestamp** (time in seconds since the beginning of the move)\n",
    "* the list of motors name with:\n",
    "    * the **present position**\n",
    "    * the **present speed**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here are the first 20 lines of the first move we recorded:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!head -n 20 my-first-demo.move"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This representation can be really heavy and quite cumbersome to work with. We plan to use a better representation in a future, such as one based on parametrized curve. **Contributions on this topic are welcomed!**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "A move can be loaded from the disk using the opposite *load* method. It requires to import the *Move* object:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from pypot.primitive.move import Move\n",
    "\n",
    "with open('my-first-demo.move') as f:\n",
    "    my_loaded_move = Move.load(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using demonstration in artistic context"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now you have all the tools needed to create choregraphies with Poppy Humanoid. To get inspiration, you can have a look at the amazing work of Thomas Peyruse with Poppy Humanoid: https://forum.poppy-project.org/t/danse-contemporaine-school-of-moon/1567"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <iframe\n",
       "            width=\"400\"\n",
       "            height=\"300\"\n",
       "            src=\"https://www.youtube.com/embed/https://youtu.be/Hy56H2AZ_XI?list=PLdX8RO6QsgB6YCzezJHoYuRToFOhYk3Sf\"\n",
       "            frameborder=\"0\"\n",
       "            allowfullscreen\n",
       "        ></iframe>\n",
       "        "
      ],
      "text/plain": [
       "<IPython.lib.display.YouTubeVideo at 0x104793190>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import YouTubeVideo\n",
    "\n",
    "YouTubeVideo('https://youtu.be/Hy56H2AZ_XI?list=PLdX8RO6QsgB6YCzezJHoYuRToFOhYk3Sf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Or the *ENTRE NOUS* project of Emmanuelle Grangier: https://forum.poppy-project.org/t/projet-entre-nous-performance-choregraphique-et-sonore/1714"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkz\nODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2Nj\nY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAWgB4AMBIgACEQED\nEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAAAQIDBAUGB//EAEIQAAEDAgQEAwYFAwMCBAcAAAEAAhED\nIQQSMUEFIlFhE3GBBjJCkaHRFBUjscFSYuEkM/BD8XOCktIHFiU0NURy/8QAGQEBAQEBAQEAAAAA\nAAAAAAAAAAECAwQF/8QAIxEBAQACAgICAwADAAAAAAAAAAECEQMhEjEEQRMiUQUyYf/aAAwDAQAC\nEQMRAD8A+foQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQ\nhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQ\nhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQ\nhAIQhAIQhAIQhAIQhAIQhAIWgYKub5YHdWfltb+pnzP2QY0LZ+W1v6qfzP2UTgao+JnzKDKhXHDP\nG7VWWFuqCKFNlNzzAj1VhwlQbtQUIU3UnN1IUcpQJCtpYd9UnLFuq0UuF4is8Mbkk9SgxIXePslj\nx/1sN/6nf+1cvG8Pq4KoWVHMcRu0n7K3Gz2m4yoThEKKSEQiEAhCIQCEQhAIQiEAhOCiCgSE8pRl\nKBITylGUoEhPKUZSgSE8pTDe4QRQnlRlKBITylGUoEhPKU8hQRQpZCjIUEUKWQoyFBFClkKMhhBF\nClkPZGQoIoUspRlKCKFLIeyMhQRQpZCjIeoQRQnlKMpQJCeUoylAkJ5SjKUHo3iyj0UyoTARAQqq\njVaSqqhRWSoFlqha6izvCzRChZ61u0WWmOZadldimoJVMLS8KqAs7ai3BjK9drAWrtK4+HEOXWwh\nIeCtYs16YvJZ6LynHWTWJK9G2qSwLicXbmdJC9GV3HPH2805sFQha6jBOiqLVwrpFMIhWZUoU23p\nGEQpQmAps0jlTDFKFIBTbUkQDE8qnodUwQptdRDIjJCskRqibaJtekWt7J5eylmgXRnk6KdiOToN\nUi0KQfFkiZTtOkS3ySLVMBMa3sqivKgMV3omBp0KmzSoUidlNtEnZXt72VoMDRN01GUYc9E/w+xC\n2AwNkSPVN01GT8PbRI0Y2WslKZV3U1GQ0uoR4Q6LSQFGFU1Gc0+yXhdlpAkpEeSrLPkE6JFg6K8k\nMF4UBUpu+IKppSWjoo5bGy0QDpdQyoKsvkjKrQyNUFvZGtKgB0CcdlPJ1TyiENK43skG30V2UDol\nlRFWXsgtF1ZHkggTqhpVlEoyiFZlvpdERaFTSvL2Rl6hWRZEImnYJUCpkqBUCVbgrCQq3kQgpeFQ\n4K911U8KUVtEGVcDKqAVrdFIpOChlurSFEC6lVKkIK6OH1CwMEFbaB0WsUrsU38ixY8Zhda6Lppr\nPixIXa3pj7cSowSqXMC21GydFnc0LlW2YtSy9lfCiTe4hZrUVBqMqs9Cj0hRVeVEElTiUQFFQjRP\nLdWABK3SUEITyqYAN9kboK8qA0wrcttQgwBEoKw09E8kaqwDqQnlRFYalF1aGX1QW2sgriCVLSxK\nnlvOoQGHUoobbXRT0QG9rKeXWyrNRm1kxOqeUJ5QP8Kpsp6oFrpgTcynlE9lU2gdER1VhEGyi+Gt\nJNggpq1G02yddgsNTEPcdYHZGIq+LUkaDRUq6Ei8nUkpJQmqJBzhoSFfQqlzg191QxpMnYK4Ui0Q\nNdSppWmJKMtpUMMHEHN9VcbWGqiq47Iyx3VhEoInSyorI5dEo3Uy3qpZREnZEVnRRaJvB16K/KCQ\nDb0UYhBU4fRMj5qcXuiJKCnZSi3dW5b7Qll118lUdAhRIUiSomVERIUS1SSIUFLwqnC6vcqiFFUx\ndWNCUXVgELIiQlCmRKYalXQYDIlbaAWdjFrot0lai6baOlgVCu0kaKyiDtopuZIIut7Z05dSndZ3\nUxPddKpS2hVGiSSCL9Vm1qRzizso+FZdDw2hl9dFFtO3u6Lna3Iw+HY2S8Ik6H0W7wobmJHkhwgk\nZYB0Km10w+FPpso5Nduy2VGggn6qvK0HTW8qIzkXjVLL81cQJ0v0SInbRUVZIFgVKwHu+spjXrOi\ncZiqyhHRBGxupht9UAD/AIEEcvZON08syU8veYuqK8sidEyJOl1OASBEoggn+ECGmgsl6QptvIJh\nKxH9yoLHqnF7pt3uSpbC0KoUQDZMBTyhphp+aAJ1N+iIi3qZup5TEg7aJjlMlMAONybqor/4Fm4g\n4towDqbrdlHkJWXiLf8ATGOoQcdNuqSFpEmiXhTYyWk9CqwYMq0ZgHRodVYG45KkTymFswrDiHEU\n2OcdgBJWKnRfWdDRJXuP/h/wt1OrXxdVvw+GPXVNtSbeaLMsZWhBB6CF2uL8KPD8e+mB+ieamT0/\nxosDmMLQWgl3bT9lit+LG5pzxbzREEyAtJZDoEA6Juota/mgybQm00yRfTXogjoLhafCzGY31FlA\nNBOVwEqppTERafVK2kK40zM7+aWWSICGkMpjRKAUy0gkC8ogt10VZpWkzqQja7YQdAReTCbQeiDV\nKRJUoSIWBHuomFKFEjVBAxBuqnFWuBGyrc3VQQhNp+iDZAUVMGdQpzNtgoAxpqgFFWsdEXWmnUAg\nD1WNsb2Wik5ubmn0Vht06Dg4ayeiue17T7t1koYprBAEd91acYzeVtNlUFVzpykx1VDvFyyGkzvC\nvOKZ3+SGVqJl1SqABtuVNLtjdnE8p+SiarmWyZDvI1WirxAwRhqYpf3m5/wue+o57y+o4ucdSVmy\nLMkjWOtgFF7iSCoE2iVE3FyTZTS7Sc4xCgJgmLJgR0SItomkL94THl6JlpItqboGadEABMFMWtKY\nEj+UjYAgIAjn1T8jCC6XWF0dZ5hOoQGxkbWUTB0H0Uveg7d0ogxAKojkGWQbjUJtkGwMbqRHQIJt\ncwY0QRAvfZLLoQp6jvCNDF/NAmiL/upkktGkKLZtoVIAzYH0CqC+XRSnMAYEqQpVJB8N+U9lZ+GI\nbnJaO26MqgCRB9VNrC8gAE+Q0WkGiHMhl9yTKHYoUj+pUpsZtJhXRtE4cMbLnADpNyuZxGlXqNzM\nBLNwuo2rhS8TiaTZ0Lnhei4Zw+hiqMsrUq3lBV62vf0+ZERqhfRcf7J0MQSMvhuOhC8nxX2a4hwx\n4z0/Epu917Lyt3HXbE76ccarRQaatZtIGcxhei4F7IV8c0vxlOpSYRLTIWjE+yzuG4htWnNRgMxu\nFl0mLs8A9nGYdgfXaC6x7L01PD0qFAMZFNouYssHB+IUq9FtNzg2o0e66xV/G8SMJwuvXa8NqBsU\nz3Oi1G7fp4vi/EamOxRD3scykS1mVsCJ1+i5ra2wcR5WhRHNcmTPVRcSHZoHobLne02uJB6AdUjV\nLn/DlGtlU52a3wykXFruYyOiaNpBxi5Em+iHGPeA9FWSDMmDtdHxZidAqztYYzKBabEQO3VICZcT\nfbZIC0TBGltVU2DJkbJNJuNo3Ui4gFsAg3mNFGRNtkQ8s9BfTZPLLsn7JZIuAe4TygQead5KIulR\nJRbayiQVhQUOtokl0KgiT3UHRbqpuUCO4QKJBQ0gDZRuAgSoqQMoLp6Ql6pztCCbbGbQrW7aeapH\nyVtNw6WWoNLACCTdTAVbCrfNajKJVTjG0q0+apeIdqYQQcZEi3ZVm5AUyJMBVm3eVGiOYeqHWFko\nEXCCYAjVRRIjuj1QIi+qfkFFLzNjugCTrIQIm+ikA2biyBXO6IdHVPS7Uy3MPekhER0BO6V9dFIA\n+iRBzIoFzGtkZTAUog2iUCdAEQriTuVKnSc9+VgL3HQBX4bB1cQ4Boyjdx0XcpMoYDDuyjny+/C4\ncnPjhfGe3XDjuXbks4XWI/Ut2bzH/C2U+E0G0yapI83SU2Y17oaCADpG6VXOJe33o06r0YcWV7tc\ncuSTqRHwsDRuxmaLXMqAx2RrhRYGydYWSq4NdIP6dVsA/wBLu6oqOMZhabx+4XXwc/JrqVnPYTUe\nYmIWd1eQeuypLi5paN5jzWdtQwD01V8U8mhz3PqZWaq7DcJp16hdi3uc7oDACy4d3h4zKTIOhXXJ\nyAVAuefXTrhNzbJieCYcVGgPeBtfRb8H7JVHjxeH8RfRrNuJEfULPUxIdUB6L0vs/VzHXVZlrrMZ\nUeG8Xx+Crt4d7Q0oLjFLFN91x6EruYjCjENphwBDL3U8VhKWMwtShXaHMqCPLunTcaeEpCtHiZQC\n0bldpdzTFx1dpNeyk1tNsZtguZ7Q8TfwzDMIoh9SrIaTo2FtwtP8Ri3Yt4EsHh040H9X1t6Lle3Q\nH5fhuvi2+RS9J5bjyFfGV8Q81KlQknpZQq1qlVsVHvdl0DnTCrc3WT6JlpFgB1WGdo6dpCUugt27\npnlkNMnoFHLJFvkoJZoBiPIhJ1+oSAuTOu8ap8pifl0RSLfisQAmJBaYjdAINyDbVMHMbbaKoQAi\nT63UnFotHL1KQJ+IghOxHu26oI5RJaYvpKGkgh0wgyA2AL9kEz6iJCIeUC3S1xohribTdu/2UReO\nqi4XJg21lUXxAvulHdBPyUTchc1M6eSj12QidR1QRP7KvrZSvdRdY9UCPRp1S0va/RBlAudACoGR\nDtUwSfNLVIQTARUwRYxorKdyqovYypt6m0qo0s7FXNdZZmnRWg91qImTZQfqLpl0XUCTfSFRB40K\nrdHT1VhII1UDZZqomDofookX6KZieXolvcWGqikWugGwHVOItpZMETb6pmQYUVANOhiT1QBc2J7F\nTiQLjqmTEgIK4Jtp2UskXn0lSmRpAiycNy2180EA0i25SLSJlWZbJ5ZJgW6IKg2Y1C04Sh4pOdxD\nBqqTZwVxrCmwMauXLlZNR148fK9t5xfhkU6QAaF0KP8AqKWV4EwuEwZ255iFJnEHV2lorfhqDLPq\ni7ndmjqvBlw3L09VymK3CuZQr16BcHU2Ov8A2Tv5LY57qTSKjfEaOmoXOxFM4fw6jKQokDkw8Zql\nYHUv6LdSqZqQykuZENdu3sV9v42UuOvuPl8+OstsNZjSXgHNTf8A8nzWMuhsG+xK6NdoDpZAJ1bs\n7yWGoOYn5rvY5SoRNIgWMyFniKjp0Ku0VNXWQsVVdd3h+G4asP0XSGNY7BuE7WXKquBCyhzm6G3R\ncuSb7jrx5fTs03TC9b7O/CvG4Yk5PJe29nqfulcMXpj1DdFysfU8OrVxL3wKbfDoj+46n+PRdUub\nTpOe8w1oknsvC1sfU4txQuEtosP6bP5813xsjnlu9R7jAU20sHSYz3WtAk6lea9uqkuwdIf3O/Ze\njwLj+Gpg9F5f25vi8Je4Y790rNeWPu9Z+hRbT5qTmjMYJ8ky0mLfNYZQcCBZvNvKWkR+ykQRJd00\nCWpmLhVScCb6A7KJa2CRa+qs5S3LJtcWUSDYyQeiBQCC7S251RciI1TdMzJsLqJz2Gh6oFADiIBn\nqpAw3LHodkiXC0gbJOzETGhtARACLwCBKYPKBcQLqLTLTaAEw4xFo1gSgk1pJzCZPdRaHFxIlziY\n+iYc1xBdIF8vZRBmSBfZUTmdkHRR13Si8LmoJvdLNqhwASHVAONtVEp6wEjIEdECddRTMaIOgI6o\nHFtECANUj3lDboGIyz10U2kTfVQkT37KbUFoMX6K1rjCoaFY0g+S1EWSI0ShAiUnE2vtdBEiHCD8\n1EkgxKkYB1sok6/upVROotB2QZcSJuU5mBGmiN5AUUol2ilADovKLxBKQbaVFSQQYMaIBF5iT0Ui\nBp80EW2AGqkAPmmGgREoDZZBQIg6CJ6lBkmTAtqAp2gBx06KNiTsBogJAsBtKyVH862uFrgTC5rz\n+pdc8puu3E0FxqsIBIw7INVw/ZbKNP8AEPpNY0DEuA8Fnw0Gf1HqVy6AJrAMdDvFaGjZei9n3NpY\ndxqUgXOeQam7oK481/HhuOk/bLt0+G8O/BBxzNqVn++99y71WWvg6uHrvdTYROtI/wAdQus3Btqs\np1fEc06xsqKuHxAn/VhzZkB9OY9V4OL5GXHl577dcuPHOeN9OFWAqNJpnfma7Ufdc+ry9ZHVejrY\nIVv94Mc7+poIK5uKw1KkcgzVHdCdF9XD/I4Z9WdvHfh5S9VxH1FQ6pK7lHhYqvBqNkD4W6epXTo4\nHCUjJpse7oBYLPJ8/HH1Gp8S/deKe6ypOq93ieG4bFsLX0WN6ECCFwsb7M4mmc2F/WZ00KnH83DP\nq9VMvj3H0pwLPEqNAXvuBUCxrSvC8H5MYGPEEGCF9N4exraDY6L0Yxqo8aa93CK9OlGeo3KJ3leL\n4M0s4iWPEOFiCvT+1lWpS4W11IkOa8Ot2XnsPim4rHYTFNEOqs5/MFYyzs5Jj9Ew/Xb2+HEUwAvL\n+23/AN5hOhpun5r1ND/bb5LzHtvTdnwlSDEOE9DZerJwry5EGBJG6RJDhJnumbkxpGqYZIIDZMb9\nFyZQPzJ2S8I5S7T6ypuH7WCY2NxN4RUI5RF/JINGbc2hSuZBMOnpoouNtL7zugHXEm0ad0jzDU/d\nJzXNsTKkANHCbW3VEXHlHJpuAkZF32vspZnQbCCN9lFxEkgz5WRCvTdmE6+abYJloIE9UoGb0vsm\nGlzhs079FRCBaPdUs0sym03Fk3GLfXXMh0hgfMz02QRJvMEQk4zYoglxhIkALCiSBrZImfmlKQ16\nhEBuZCRmwCY0uEgYF1FRNt7ogwmY8pSk7oGLBMWgqIt19U237bIJAib3hP5+aiNBdTmxQTaDEaqb\nSAoSI00UmmdZWkTBieqWYEC8lAPRIwBIugDNyo36SpOjuUTEQoqMHYSUxYa6Ik5p0RqVFK0T1Um2\ntdRda/7IBOhFlBIwXeSm0FomVBs23VgBMzrrqiiAECQImCUBjs0yRPVMsPZACJ1gpEhWMAyzFz1C\nQbPwwggJcwjXzWHENy1Fv+GfhCyY0EBrlnJ0472zEAGoZhwyuafVej9nq4y1OG1oFSm45Z3XngwV\nKrW/1tI9dl0+DVqfjup4tpc2sBU8QasOkrhz4+XHY7Y9ZveNgMaAIgJloIWTBvqMAp1nZ2/BUHxB\nbQvkfbvenM4xXbhcE5wOV7uVpheSY9/iE5s5J16r0PtSHAUDfLDgvOzmAnSNF9P4vDjePbzcnNlM\ntRsZiiBvCsGMY3VwHmsMhgzO9AsT6Tq9STYbBMuDDft248s8p3HoGYxpNnfVbaWKhs5tl5qjgIIN\n11KOCa6mRLgY6ry8nHhPt0cjDML8Y6o3+sn6r6Vwgk4NmbWF894VHjFp1zQvo/DGRhmeS+xh6ePJ\nyPbKtlwraQ1LSV57hop0q2ApbgHN5lafaPGfi+JvDb02cg9NfquWH5H03g6OBsZXLwtzuVT8mpMY\n+l0fcHkuZ7T4b8Rwao7LmdRIePLf6LZgKniYWm6dQp48A8OxINwaTv2Xsrhfb5oWnYiCgtAnKZ6y\nVM8zQNJCbQARPN/K5IhHu/WUiSXghoB69ArMv9RIbFovKRa2S1uyKifDzyQTOo6qIBDhYBwVkTIj\nmiEg0Q50gAxA3QQIEW6pX94AT2OinUuJvHQ7qAbr2GyqI7gOyzPWUOgE2sOhQ6R7mn7JG7RpHkqE\n6bGQM17nZOGsaS5xM2HdDjkhpaBJ76Qll5ZI98T2QIxluTZMkOh1oFoB+qg0AugzPTUKx1MNc3mb\nzWN0FF5tqloLpQddkRbqshze58kiYGsFBlBINt0EQ6SkdbaKRBGu6ibBQM8xslsiS423GqRJA0si\nmfelPU20KRjaU5nSyBwDpupdAoi+s2FkdSNuqC1vLNpUwf8AsqmmO6kLkqos3QLd5UQ63WFIG9wg\nDExvKiZI/lSIhpI6pG1hcKVUY0TA1nRT6pD5qKQBJifmpBpBupgZhNv5TAuoBjSB08lMCYEjWLpA\nTMIi+qiiH73ndMXiYUjIZBuhoB0dCKQlpzSQNkE6j3uiG+9B10UrMs2DIQIHlhw0OnVUYiiH0iBA\n6K25cTOl0Abn5blUl045cWgOGrDK6HDK4o42iYDmh5pnu11wsmNZ4dcmIDtlVRefdaeYiPUXC53H\nyx07b7mT32GzYe9CX0fipHVvcLq0XtqMDmGWnRcjhVdmMwlKro8t1HVdGm0sdIgE69CviW6uq9Xu\nMXtJR8TAMdHuPH7LzVFpqPLaTBUAF5XrOOUzX4RXGhaA75LgcGp1KdWWszA6916sOS48VZx45bus\n9PB06j4e4scdn/dW/l1SYY0O7yvQU8LTJl1MT0OytNOnRYXuyMaNzYLh+fK+nXqOJRwNXQsKtqZM\nI2arg3tN1DiHGgAaeDP/AJ4/ZcapUqVAX1HS6d916uP4uefefTy588nUUYes1vGjkEU3PkL6WHmn\nwmpUZ7zaJI+S+YUKRq4iW2OaV9N4UfF4a1r7y3KV9Pjcsu4+eD3TqZHXdDgPCi0x9VMtc0hu42Tb\nlDhEGRedlpwet9l8Z4+Ea0m4C7OO/wDx+J/8J37LxHs7iDhOJikXcjrhe5xDTUwdZo+Km4fRdJem\nsv6+cWmPkeiZkNAIg99khJF2kd0wNDYCZK5so3bA/fqpE52kkEmbGEAX92W9JSAh5Bgh2l9EEZc1\nmdwgExIG6RHMGum6kTlaRfzSAPutMEXtqfJBWQQ0vI9SVFz2vJyDKSNlY5pLW6k316JNDQHFpsNl\nURObI3Ic26iGBoDmnMCYiFIMNN8fOyjZpcC2WzEqg8SBObK5pNifuovBLhTbGk3Cm7MX6NAGxGii\nCJcX1Jce0j1QIBzySYEhQHNb351k3Cm+GgTdoGp/hIPEkGZ2I3KDOT80HRMDqdErjXQrIDrJlLUy\nmZIgjRI2EQgjMJ7kx6FKZNrQiJNzfdQNoEbBR1kaqUgeRUBE9EDvEbpkw65SHvXKGwSfKyKnM9ey\nBJERcqPvdAptPXTRA2i8jopxIkqAF9VMRFigfyujdAjXZB3lVEth2Q4Gwm3VOLnKdt0rTdZU7Ej9\n0CfhCYttcIuPe3RUgYaOqnmy3GsqvKYhNjZtpKyqYJiIIM6qQB0O10sp3T0Gouim0kA9OhWLF4+n\nQfka0ueO6trYmnSJZmGeFycLRNfFhrzvJJSa+zVvp38DTr43BuxDaeUN7/VRE9rq7DYsYct8I5Qw\ngOaOivq1MJiK74plpibFeac9lvlOnoy4P4xxBM6hIEjSxlavCw592oR5iVE4ZkQKw+S3+fBz/Fk5\n+OpZ6ObcLlB2Qk77ea9FVoNLINVsLztUZXO7FbwzxyvTUxsx1XpvZnFZC+iTIHO3yK9fScHtBFwV\n8qw2NrYWuKtF0EWvpC977P8AFG43DjOWsqj3myvB8vguOX5J6rpxckyni7lSmKlF9NwlrmkLk8La\n6p+k0FoZYldlui+dcYx+O4Tx7GUsLialJhfmABte/wDK5cXDeb9ZWsuTwerxvF6WFqvw9JjnVWSC\nXWAXBxmOr40h1V8jYCwCx06z69FtaqS+o+5cTclTnku0a2PVfT4vj4cX128uXJlmQGvLY7hMMLso\nBnomyCYgmNVISCTIAAtO67uSPCGl/EMndfScDSFHDAdl4TgeEecW3FR+mamT11XucfV/DcJxFUat\npGPOE4/Tra+eVJLi6LklDAJAMQBuEmkhpk+fVTBOQNdlcDeYuFXJSXnD1qdVp9x30X0vh9cYjB0n\ni+Zq+b1GNcPDcCZ3HRez9kapfwljSbtsrj7anceWxVN1Oq6mZIzOhvcGFSTABESNTELXj8v4/GVg\nJHjOA9SVmLHMcGkai+6lZRIzaCL97Jge9TgwLz5Jw4ONsziYCGtEmSBebmJ7IIU3EHK5oubkhRe7\nQw2P4U3ktBGUXEzoVBz8zZkA+SCLi1lONJ3aoXDS1sRu42UzzAVMoAnTqq2tLnOMTuRCqEWjNLjy\n7HVIXJ0VjgBIqPg2PWUiA17gHB7YQRe7OWm7YAmdU6lJzQ0uaCHfETdGQZZz3cPNQLOUXdl1MDQq\niT6WVzfEcAexuP4UCHZpGVv93VXVGCrUhgLri0An/sqZIc2A0jXaT6Kozbd0Fw0CRNkjOWYWFPmB\nINinaIJSdy23SmSLXQGhTsG6SUiSDdAufNAESABdBaNNO6cwLCyATHbdRUcoEJkAncFSMA207pC/\nmgMo6p5Oh0TB+SkTu0QoAMIMypZZ3TDwWkFRnX5oJBpALSNVKD09FBpk31U80GUCLSlE6qcwTHzQ\nDLrH5opWi0z1UpPUx3QdydD1QI0CgJmAExAEk7pdxspX9FFOw6lc3iGNqtqeEx2VoG2q6MR5rJjs\nKKrc494JL32VyMxmZurGVIdJE+sKD2OYYIUV09sy2NbcQWvzMe6ejlece7xRVygO0MHVYW1Bo5gP\nlqpfonQub5iVi4T7jrOSz7bjjmuMgls9VazFn+qVypjR0hGa6zeLFuc1dbEYo+ASCZNgsLS7DV6d\nUGlW3yuEjyIXv/ZfgAwWAZiq7Q7F1RmbnE+GNh5qHtbwrB0+GYnHljWYgtDS6NfTr3Xfi4ZjHDl5\n/K6jkUOD8P4lw9+Ka11XFPElmFZDaZ6RorH1sB7PNoOovbUrVxzVHMDvDgRbouLgKxfxDBYfhVXE\n0fEDW1hniXfERG0Lv+2PBnYyqzFYXI0tblcw2nuumunH1Xo+F1XYyt41BzamCc0ZXNObM7eenkvJ\n+3/CK1HGDiYDfAq5aZvzBwG/yXT9iMTT4bwDEVMTVbSb45BzG0gBU+0GNw3tFw5tOhjmk0Khe8ZS\nJEQICxOPHflI155enjsJjPBGV12rt4Km7GubSww8R7tA2JVnAeE4LEY2hGHqYlpuQ4GNN9l6rA+z\neC4HiKnEqfiPqAHJTJAAJ2CtmzykeOeDTc5rzlIsQdQraANV1Ojh2+JUeYA1ureO8JqUcTTxVWuH\nnFZqhYzRhmYnfVeh9keE0sOz8Y6kBVy8pO0rnlNNTLrbo4Tgpw2Bw9HxAHtqeLUMTJjT6rTxak6t\nwbFMYRPhk+cXWsEvKuFMOpFhFnCCtY4zCaZ87a+Wjnd0B0skHOkNH+U67BQqvpOn9NxaZO4MKlzt\n9wsXqtuxwXAHiGLDDdjLuEaL2uDwtLCU8lIQF4zhvEqOA4d/o61J3EK3LDzZvmvUcHx3i4FhxNVg\nrCzr6ldMY36jx+KLvFqsgHLVd5m5VYafEgtE7krRXAdjMTUblLfEc4STzAk9FQ7K0H+snR23ksVk\nhmzWEbhQytB5pibq7w80ieYCBzWEJWLGtexpbGvREVPIe9oqOygCMyiWtgO8TtpKseAKbRYdQN+6\ng0EOdDZAEwEFZylstLrXnRINnNT2NjmVxot8Uklp1s0fKFSJc0W9SqiunALr6XypAgkuDesyVPK+\nqeZpc46d1Bk03ucW6+6Z0VDLSA50N5YBvv6JODnAWhs9bJl2cGBOQXfGgTJIFpuLwdURCaZjlJMw\nJ6pODqVTJBEGdLpZQ4PMC3WxUs+ZvMDa4/7qjIQC3lHqlMKJnUaJxPVYUiAZUvhFhO3dIxluEONp\n+XZA5+YS3QLDzTkRfVA94KTu2m6QOpI8k2m/VRQJM9E2g6x8kdtEhYxugk2DsnoZzboGhECT9ENE\nz2UUQJIJ1upQ70KWaTFtU55ZiyCduiIET9FESLAXUpkIA3JPVIAgwZumZDTdHfdQOxMGfJSHfoog\n3zCykQRqiiRAsneLIgCwKkCZjqshjSbwmWCBP7pAS4BTJExAMbhRWPEYNtWYEFc2phHNJEEmbLvH\nXTVej9nvZ4vezH4tgAHNTpnUnqVrDdrOWo+e4nA4nCVAzE0X0nkSGvbBhUFpC+qe2GEw2L4fTFQt\nGJa6aZOsb+i8W7geKNM1Bh3upHRzRIPqF0y3izjdx54hb+AYVuM43hKDxLXVBmHYX/hXVeF1WifB\nqAf/AMlafZzD1KHtDgnwb1I+iY3dL1H0nFOjK3xm0xU5BzQZ7d1l9oa1LD8Iy16Qrh+VjmkTmkx8\n1or0sPiMTRZUAdVo/qtHTUSpYlrauJp0alIVGHmk/DliD8yvS87wPEsPgvZ3GNbh/EOJqUw8OLv9\nmTt1kKziWMdjOFPq03ufmbcDY9VyPaHFHHcbxVe5bnLWeQt/Cz4WvUoOhh5TZwOhC426rtJuOycI\n0+zGE8dz2sJdUdl1XEqYY0qXj4auXsmOWQQuzV4xVrYOnhfAptptEDyWXDupMByDJEkt1BWfKEld\n72J4rUZgMbhKdQ1MZlNWkx/xGNPNdrD4/iXGIwWN4W2hTcIquqVL+bRHVeJ4K2tV9psHUaTSbnzF\n2kNGv0XrWe23C62JNN9Gqwh8MeACDfVdcWMv+PMYWjiG8brcNr13Co2rkaTfeNO4X0zDMFEOpjTK\nI9F4X2hqtw3tc3E02gVmtY5wHx/5iF6zA8Vw+Lp+Kx4Aab306qXE3enVpwr26Lg0eO4SrxR/D6Yq\neMwkGWwLLseJlbe3mpZvuLNy9vnXGWM/OcZDf+qbLLTpFxAkCeoXS47WpYnjNapQ90EAkfERYrnS\nGyZE31WL7dIwVsEGAVLAz6rTwzDUn4htWqLN+qm2X5i73e6twxZmfkbLfh6rW+hYfjIMCZhTANQt\nIbLRoCVW/MSbEO3gpjMwgPJB6HZYVOo4tgOEG4EbptEtdygyJu2cqHw8cg1NiEPYQDzCCIO4UVWA\n1niDMARoW7qLnt8QBs5miAQd+pVgGpmXOiJVQD88EhsHWd1UImSdXPk2iyoyuAPiA5THN0VzhFRz\nmgzMC6LeISZ6l3TsqilxJIyOdLRuVKs518z84kXDYjyhPKc0ZQSWwDMQqzOVlznH0VAAACDMRYdU\nPZFVzS4AAQIBSDwyoC6lmEmZspMOjszuZxBIREWubSpkMd+oTGZw2UGMaJGaDoBrdD2vdlLwADMR\naYR4bXuim0vadAdlRj3uEwJclN50SmZlYVK+WT7ugSgGxMI0R71ygHagIEuNkjbbRSsR3QBJ007J\niREIMDuh2aSdPJRTuY2CIF9ktoiQn9kDcIiLpgHLpfqi/KCD6KYJG8woIhs6QpgAa6dJSYQTpfup\nFoEQNNUUGDDvoEp7I+GO6kABGaZQI2n9kFukJxrG6YBJtqoHmtfreEAw6RpEQkBLtPQILQCB80Uw\nPpdNAA3OiAJM3WaJWkEKbZJiyrBgSQu37P8ACfx9bxaoP4dhv/ceiYy26LdTbT7P8G8VwxeJb+mD\nNNp+I9fJetFXIwwJcNlTXqUcLSzVKjKbG7uMALh0/aDAnEv8SqRBID2glrgvXjjjI89tyrs5qj3E\nvDRJgAHZYsaK+Z1L8N4tEiRyghvaO6n+IoYkMrYWpTrVGNOVrXjeJ/ZMfiMPUh73O8RzmtvIGpb9\nlq6sZnTmUQ3D1CHYUNrNP/TLmiDMf87ro4XFUa3hTRLagnMLHIQNCVD8zqYfAur4unztY2oWAQQD\nYytuHFNzDWbT8Jz9ep7rMxW1aAC+YE6KjH1Rg+G4rEu1p03v/eFqoiXz0Xzj2n4/i8VjcXhGVyMJ\n4haGAC8d/MK5XSSbrzu8mSd1Y0y0OHkq5gmd9yptGW0TdefJ6MV4IgdFq4fTo1sfTp4h7WUXmHOJ\ngBYx7kgWKKGR2MosqjPTNRuYdRKxj7avp2sVhKvGKuJfwku/S/TFNtm1Gi2YHv0WSlwKvw/jmHpV\n6lH9PLVe5zsrRf3STuvQcQ9pv/l/ibcBQwVP8KxoLmgZTJvZdfFYd/EuKURWawcMZSbVIcffcZgH\nsvXqPPux5LiPDOJ43FV8a/Bve2q7O11M5hG0R5LBTwGM8XIcPiGuOoDCJXucV7Q8Nw2LFD8QweHq\nGiWgdJ6+S1YbjnCcXiGBuOpl4PKCYn5qXEmV/jy/GuG44uw3FWU6tKsKYbiC0QWubYOPmFdUrVa9\nIfia9Ss6BGd1p8tF7kZX5gcrmER1BXm/aGh4VGq9mEoBjHCKrHZS3sQs4Y+M015beYxRiocpDQNI\nWXxCX94hTqvh8tsCIBKVJhps8YgRMN3us+21j3Oa4U6Qu7VaKcMpj+sarE0F1STE9YWxrcpym02k\naO6K0i2oycpbomPDbJeAXHYzZRBfTMuv/SY0Kl7+Z1swuVhSJcbBsEOkhTD2gNIES7QXhQZUqWJL\no1IBQ4wGwczdO0qKtqlz5IA2IkXWZ2YVSAAXCSWRCm6CQS8zHzUnAZiXtJteZF+iozuIdmLQBadE\nnk5IbmIDeY9ypVJNnEMOp7+qi55ENNOMoEzp6qoXikjK1nMRvunUqTWe1kObM2Fjok8MjkJmJJ0/\n4FGDnyhl7WI22VQU3yXEAGQbDZRIFOoWw2SM06KVXKG0mutE52hsEeqrDPecYjXWZREyGNa1zSDe\nNI/4ENe7naABm0A062UKoBLWiQ4SS4qLHEmXHS2iow3deJJOyQvomBcdk84LbCDN1lS33T05oJCN\ndLpQSDCgkPVExtcoFjlOpTJFheUCsblSBtc6o0dEIOY2UU2gl0AJmQ6wiUnQNCpAzugeUjUiR0KI\n1MROiAIHmnFxKipNDZJBsN02jNN5nVRMabKQBaC3NYoE6GuBhHvETZONUhAMboJaSCUrbFPLJ2CZ\nHYeaBSC7WApXAuEmQHyRbopkCRlN+iKiJMypCSQNAg6dCpty5CHTm+FQGURbddPC+0tbBYMYWjhW\n5qYjOXa94XPytEkEiOqBTLoAhb47JWM5uMfEcVXx78+IqvqHWHGw8gsHivousSey6telLjMCFzqt\nElx26Lvl25TcQ/FVs0tJaR0K6eA9o+LYRwAxDntHw1Bm/dc2lQcCXH0V7KJLZIXLWvTe9+3p8L7W\n0Kzv/qWDZcZS9ukHWQV6HBY/BY5rWYauHmZjNdfNalPmjKI6qttOph6zatMua5pkFpiFvHKsZSO9\nxPjXGMNxPG02Yw0mteRkbBAHaQvNhj3EudJm8nVaBVqVK731HS83JJkkqZpmmOaZNwreyVzyDJGq\nspkhv8lTeyH99fNBYAL79FxyjrjUuUC9/Jdr2boYMnEY7F3pYVodH+Fw8waPoul7PYXDcQ4mKOJa\nXtDZDJyg+anHP2XP/V3cEzGcQxlIufhOLYKo4B5cxofSB67hHtPxGjiq7MFSj8Ph+UAaOcLfTRej\nweBwPC6DxhabMP4u+eJOwkoPDsJVcw18PSFVpl0hrifWF6nm2+b1mtzHlAA0AVbKDadQOeC6mTcA\nL6RiuBcLxdYudhxTMe9S5Z/hT4ZwPAcNdnYw1X7OqGSFnTW3lsPgcWzDVKuHZiW0Q3OHBxaABure\nO4t2LweF4g15qMqN8KoGiwqN+69NxbhmL4mHNZxA0sM4Q6l4cz6ys1P2fw+C4XXoVKz3sqQScoDa\nZGjoWM9+4uNjwoqNquDH52idmmAipWpiplGcMGgyLZjMNW4fiKlOuIeDyg6R1CzNaS3QEn4nGAFI\n6LGOY6XU6k/0gLVTMU3TIuLjqsjW+JlBE7yLEeqdOkbDx6jZJJJ5glWNsNiHOhvmTKdmn3AIsWkr\nK+pWZ75aWttLREea0B8tbmEAiRfXusKM7mkZbWsI0SNQiXU5hwi6nSBqVIZHOD7zkqZexpALBJgy\nFFRaA64y5RqUzWIYGzcEwBsgucZDRAqXNpUW03AkNsHCRO6oG5WlsNDnxsVTWL3AtiWj3nBWVBcE\n2brYR6Kh3KZdIBGirJh0taCQCRGWLeajVL+Vs2ZYEKdWW5WtkNAg5R1UQcsOzGdY79VQxLozF7mg\nEFw17hQzBwcQAzL1m6ZcTJzDIRJA69+qrdUogBxqNAIgidSqiIgnxNWjXdW0zlOeCHOaRJMzeETS\nGVrnMAIB98XG3kq3YtrWtArgkcrRm0GqDFqbIa2EpMQDCJc6wWVMMDgSNAmTvMyIKRJB2IClYmQI\nlA7hukd0gSTrKfw3PkEhOoMKCcNDxOm6QGu8ptALgITdOU7QYgKKQGbUwUxAN79lMFwGTaPmo2Ag\ni5RTDbTqnmgCD6JEEAag9E3AmHC6gbZEwLlWNAdDSYv8kNZyZ57d03NyiATfUoIGfeF9pU5zGSLj\nooNa4iM09lNgyugzpsgRIBtMlO4aQDIPRKOphSZl0E+m5QGlyZhIGTJMElN7pOXLcaqIIkCZQTLY\nNyOoU/jkadUmjmay19QTZOGtEAS6dZRUy054MTuraXKQBruVSCJ7a26q1jxkvGaUFhaKlOCBPmsl\nTD3LshDTaVrptcbAT/cpOh7YFzuSteTNxY2Ug4THzUhScAWhouVqBHhtaNuuirc3KQ1rpLSpauma\npRMXYAVQ6mHCASAOq2VjoSbDQKov5hLZ6qys2MjaLS+xmbzGilVI5jqY3Vzjs07XMqisA4ANJBjd\ndduemNwBg3+SHUzmEg5Turntz3MAxpCM1xBtEFYrWLO6lIzRbqimzK/MwlpG4MK/mFMAkOAdokwN\nzDMIBlSTVat6bcPjsfRpAUsbXa0CQC8n5Sr2cZ4q4Bv408w+IAj1lYGQ14aT/hTJAMtiTvtC7bcd\nNp9oOMMzf6qwP9DY/Za8H7VcTpgGvTp4hmn9J+i4eQ3JvBiQZCsp1W5BTDN7lJTT2tL2ow1bBg1a\nFenPvZXAR6rhcW4k7GY1xoPrCgADkdVLhbUwsbQKVEsMnPpOqKlUU6ApNHWesK0jZh+I4bG0m4Ti\njXOpMH6eIb79Lt3CK3AsY1njYIsxuHN/EombdMuq5taMwJGQR/ttRhMRUw7w/DVajb/C4tuuFx16\ndZVtShUoFpe19MawRBVzXEc3JJdMdT5LTR45xlriDiXPA2fTa7+FYfaLE5P1KWFce9ESpvJpzwS4\nGAI3so0n+CzmIdSDrT8P+F0vzV2ZzanC8Cba+Fl/lRfiKT2g1eEYPKemb9pWbb/BQKmZxmmDJkCb\nJyQDkpw2JIO6s8TDUnzT4dgmwYnn+6dTiPFP/wBduFojbLRH8ypvL+NdKXAhrZJJHT4RskS/PUzM\n8MkQ2NArauO402o2m/HTLZOTK2O0wslZ1Z1VzqxdUdYtFR+eys8kTzuFd2U5QBF4lVPe1rjlaGlw\n66ecq0YioyKbuHYd5ImAIPzCi5+GqOIfhK9B5BBAIeB6FXy17iM7Kz2AFjBUjq2Qs/6zgczgARsF\nv/QeYo4xrTBAa+WW2F1B9OpSgVgQ3RrgNPUarUylTVZnUif9x8iwABEadArmsGRrnU25HOytubEd\ngkWtqNBsXAQDsPRTfTf4B8Qhopjkc0arSKsnghzH0W58wEOboPupZwGS1rQ9hJzQJULlnM8Ek66q\nGeQMjOU9RqUGQtdGklIzlAKRJLQSUZv+dFlUoABBs7umbXBSzHe56qTd2kTKB31mVIPhsWjqhmUM\nIM5lEGDp5qCw5crXG7iUobPKD81AAOdE91Y2BqS3uikINnHRWAADNMnZVOu50XndTECDJlQSAi4d\nKbCJkAkJTa5trdTYYbc6nZRQ0Auho13lSLY5XHQxZKDYt22QDJMa6oJhsGGyTuUoB1nS6kwkuEWg\nXvqosJc7QEd0EhIPPvp2SIBdO+wSALpgCyJvE36oHHNymHTqUg2XnN11hOMzwDtvKZ7mbalATBMC\n4UgDlNrnfoge84QbDQC6QmC1ogR80VbmnKGtAkXQzK12kjqo0wC09B12UmvGbLMAnWUF8gUgHPB/\nt3CUBwgTe2qiScxLRb+7VIcjok6zKCyHEsMwNABsq3AtqwxznNNzspuM8t41GVUg83NsgZGZwaRq\nJlVzN8wBGllaCDmdYntaFW5zQ3K283VjNUgFvNlEA7qFWQ+XMjNfyVz7OtqdQQq3uJbBbI/ZblYs\nZ3cxLW8zuyhUECdQdLK5ocCTSHNGotAUCKrZBkEDWNlSIta4Cm5paZ26+iRYS4ucBOw6qbgBDG2P\nwnr6ptYDm8QnNa83CBQWEy2Hh2hGiuxDbZmxB3GireMwFRzw6LEapGHQ0k5ui0yi6WtbAvqe4U2C\nBy6wCCDCRBMNAJjspURzBrZvaUF7QYFUuzQROaVMB73PmJ6hV1KnP4bCCxpta0qw0i1xfctAk3uF\nRVVzFzibk7n90BgY4Alp21sriR4IDblwsSoF77BzswbZod8CzWomwmCCYjSVKz3BxF3FV+IS8FwB\nveBYq+m8ODoABdYdllpKpSJDyX+7aN4RMFpzF2aOUpPbNRzc8nQpuGWixzS54Bgx+yipWc0tEw0z\nM6KWUUy0Em94B7KxhoEvdUqFwJGggiyqfDnh2YHYbSopOnxAHuEPN+3dVzne4Q3KGkSRHqtDmiqW\nMzNlzSS4iIWYlpLy5roaLT1RDH6dRhs4NGrNyqWZ883Jq7FTZmkGOYTOU3upOLMrMgMfETeVUQDW\nkBlMZi4S5xFxtCrYypQafBquYwm4mx9DZEtdIpvyACxkypV8ozeJkcSA2NSFdS+zaH4mnmAxVIgD\n46eg82qxz6VQG+czykkjL6Krwjl93M4j3dfVRZSIc6SA8kC5Nu/dTxs9U2vbSp5mXblIIJmxKn+C\ncKRaatEyRzZwCB6rJLnZi42Y6L2M9grqhpMGdoFiQCW+90numsv6m45RBu6LSna0aFZPxdSIhseS\nDinkQQ1FbCYF9VKwyyTKxfi6k6NPog4uoZkNv2QbZIJj5qXxQJJOpWAYx4+Fh8wU242o10gNB9UG\n0AXcZgKUh7xsIuueMZUAIAbB11R+MqdGqDqB5aOW0boudTH8rmHHVT8LPqpDiFUNjJTPeD900roh\n2axuFbTkiLC17ark/mFSPcp/I/dMcSrAQG0/kfuppdurGpBPZNr4BESCblcocTrAzkp/I/dDuKVz\nIyUxPQH7pqm3YLWyHMmCoEiXZfdH1XL/ADWvEBlMDyP3S/M60QGUx6H7po27DWlwzNGgkidlJoBO\nZ0tBb01XFPFK7jdtP5H7pnilc6tp27H7po26zSWaGFKcwzOjym5XGPE6xM5KflB+6Y4pWAgU6XyP\n3V0m3XY0PfJmPijVSblNmuvHSLrjDitYf9OkfQ/dH5rXBkNp/I/dTS7dtuaB8Ji87pvZDg1pkROm\ni435ziP6KWke6fukeMYlxktpnbQ/dNJt2mvOUDvqrM4s3Z2q4X5ziD8FL5H7o/OsTmaclGW6cp+6\naXbuVLHI33UmNzg80EbLjjjuKGjKItHun7qLON4ljszWUgYjQ/dNJt2nQWhhGURISDm5mZrNadhd\ncQ8YxBuWUzaND903caxLgA5lL5H7po27LS0VM2sGWjqq3uaGuGUl86nouT+cV5H6dG3Y/dR/NK0k\n5KZnsfutI6QpmSZsTqVW4Oe/M58htgZ+iwHilYxLadux+6j+Y1s2YNYPIFB0qgpuyzqTIjRVOBNR\n0RliJWM8RrHUM+RUfx9X+lnyKu003Uw5pAj5hTZUax5dEkaLnHH1SZIaTpN1H8ZUiMrfqrtNOlLi\n+AbnqVpY1tKarQC5wIa3XzK444hVDs2VkxGif5lWzNOVkNEAXj91dw06zQ2mTNAREEyfop03uZmI\nMNNj3C5DeLYloIblAJki/wB06vF8RVILhTt0B+6biadk+GWugEtB5eaLJNaHUjLmBze93LjHitcl\npLKfLoIP3QOKVwZDKc+R+6lrUjs03UocDnII2MQVe4eI9xzEt2hcBvFqzPdpUgesH7pt4vXaCBTp\nQTOh+6iu9Rpl4GZ7cuaNOZWMgV3ZWkNDvisvPv43iXxyUQRoQCP5QeN4kuzZKU+R+6g7bmtpuyVB\nldrDgZVrCThy1zgxwMkdVwPz3F7tpk7kgyfqgccxQqZ8lEmALtP3UXb0Lc2QPa3mqOJdeJjoqn+I\nS5pyl4tA+64f55iSCDSoEkzmymR9VD85xN+WmSex+6qO81zgYpuLmtadTEKoPb4VQmcxgAgx6wuP\n+c4m8NpgnUwfuofm1e/LTvrY/dUd2i/IPfE5eSRM9lHwyKrTlc5tyCTEris4tXYQRTpWtcG4+aG8\nWxDbQwtmYIP3V2jt0szXVHtbJEse3fzCk3xWtL21WOp1jzE3M9CTouEOL4gFxDacu1OVI8UrEEZK\neUmYg2+qbNOsykwy+q5x6bk9SnXGUsf8LgHQXzP2XIbxWu1+bJTM6gg3+qBxWvJllIyI91NpphQh\nCy0EIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgE\nIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgE\nIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgE\nIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgE\nIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQgEIQg//9k=\n",
      "text/html": [
       "\n",
       "        <iframe\n",
       "            width=\"400\"\n",
       "            height=\"300\"\n",
       "            src=\"https://www.youtube.com/embed/hEBdz97FhS8\"\n",
       "            frameborder=\"0\"\n",
       "            allowfullscreen\n",
       "        ></iframe>\n",
       "        "
      ],
      "text/plain": [
       "<IPython.lib.display.YouTubeVideo at 0x104851650>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import YouTubeVideo\n",
    "\n",
    "YouTubeVideo('hEBdz97FhS8')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
